package com.ruoyi.tools;

import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.payments.jsapi.model.*;
import com.wechat.pay.java.service.payments.model.Transaction;
import org.springframework.core.io.ClassPathResource;

import java.io.IOException;

public class WxPayTool {

    /** appId */
    public static String appId = WeChatConstant.WECHAT_APPID;
    /** 商户号 */
    public static String merchantId = WeChatConstant.MERCHANT_ID;
    /** 商户API私钥路径 */
    public static String privateKeyPath = WeChatConstant.PRIVATE_KEY_PATH;
    /** 商户证书序列号 */
    public static String merchantSerialNumber = WeChatConstant.MERCHANT_SERIALNUMBER;
    /** 商户APIV3密钥 */
    public static String apiV3Key = WeChatConstant.API_V3_KEY;

    public static JsapiServiceExtension service;



    public static ClassPathResource resourcePrivateKey = new ClassPathResource(privateKeyPath);

    /**
     * JSAPI支付下单，并返回JSAPI调起支付数据
     * @throws IOException
     */
    public static PrepayWithRequestPaymentResponse prepayWithRequestPayment(PrepayRequest request) throws IOException {
//        ClassPathResource resourcePrivateKey = new ClassPathResource(privateKeyPath);
        String privateKeyFromPath = resourcePrivateKey.getFile().getPath();
        // 初始化商户配置
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId)
                        // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名
                        .privateKeyFromPath(privateKeyFromPath)
                        .merchantSerialNumber(merchantSerialNumber)
                        .apiV3Key(apiV3Key)
                        .build();
        // 初始化服务
        service =
                new JsapiServiceExtension.Builder()
                        .config(config)
                        .signType("RSA") // 不填默认为RSA
                        .build();
        // 调用接口
        request.setAppid(appId);
        request.setMchid(merchantId);
        return service.prepayWithRequestPayment(request);
    }


    /** 关闭订单
     * @throws IOException
     */
    public static void closeOrder(CloseOrderRequest request) throws IOException {
//        ClassPathResource resourcePrivateKey = new ClassPathResource(privateKeyPath);
        String privateKeyFromPath = resourcePrivateKey.getFile().getPath();
        // 初始化商户配置
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId)
                        // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名
                        .privateKeyFromPath(privateKeyFromPath)
                        .merchantSerialNumber(merchantSerialNumber)
                        .apiV3Key(apiV3Key)
                        .build();
        // 初始化服务
        service =
                new JsapiServiceExtension.Builder()
                        .config(config)
                        .signType("RSA") // 不填默认为RSA
                        .build();
        // 调用接口
        request.setMchid(merchantId);
        service.closeOrder(request);
    }

    /** 微信支付订单号查询订单
     * @throws IOException
     */
    public static Transaction queryOrderById(QueryOrderByIdRequest request) throws IOException {
//        ClassPathResource resourcePrivateKey = new ClassPathResource(privateKeyPath);
        String privateKeyFromPath = resourcePrivateKey.getFile().getPath();
        // 初始化商户配置
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId)
                        // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名
                        .privateKeyFromPath(privateKeyFromPath)
                        .merchantSerialNumber(merchantSerialNumber)
                        .apiV3Key(apiV3Key)
                        .build();
        // 初始化服务
        service =
                new JsapiServiceExtension.Builder()
                        .config(config)
                        .signType("RSA") // 不填默认为RSA
                        .build();
        // 调用接口
        request.setMchid(merchantId);
        return service.queryOrderById(request);
    }

    /** 商户订单号查询订单
     * @throws IOException
     */
    public static Transaction queryOrderByOutTradeNo(QueryOrderByOutTradeNoRequest request) throws IOException {
//        ClassPathResource resourcePrivateKey = new ClassPathResource(privateKeyPath);
        String privateKeyFromPath = resourcePrivateKey.getFile().getPath();
        // 初始化商户配置
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId)
                        // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名
                        .privateKeyFromPath(privateKeyFromPath)
                        .merchantSerialNumber(merchantSerialNumber)
                        .apiV3Key(apiV3Key)
                        .build();
        // 初始化服务
        service =
                new JsapiServiceExtension.Builder()
                        .config(config)
                        .signType("RSA") // 不填默认为RSA
                        .build();
        // 调用接口
        request.setMchid(merchantId);
        return service.queryOrderByOutTradeNo(request);
    }

}
